package persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
import dominio.*;

public class AgenteBD {
	private List<Empleado> empleados;
	private List<Acceso> accesos;
	private List<Incidencia> incidencias;
	/* private List<Intervencion> intervenciones; */
	private List<Reparacion> reparaciones;
	private List<Recaudacion> recaudaciones;
	private List<Mantenimiento> mantenimientos;
	private List<Locall> localles;
	private List<Realizar> realizaciones;
	private List<Ruta> rutas;
	private List<Maquina> maquinas;

	/*
	 * public AgenteBD(List<Empleado> empleados, List<Acceso> accesos,
	 * List<Incidencia> incidencias, List<Intervencion> intervenciones,
	 * List<Reparacion> reparaciones, List<Recaudacion> recaudaciones,
	 * List<Mantenimiento> mantenimientos, List<Locall> localles, List<Realizar>
	 * realizaciones, List<Ruta> rutas, List<Maquina> maquinas) { this.empleados
	 * = empleados; this.accesos = accesos; this.incidencias = incidencias;
	 * this.intervenciones = intervenciones; this.reparaciones = reparaciones;
	 * this.recaudaciones = recaudaciones; this.mantenimientos = mantenimientos;
	 * this.localles = localles; this.realizaciones = realizaciones; this.rutas
	 * = rutas; this.maquinas = maquinas; }
	 */

	public AgenteBD(List<Empleado> empleados, List<Acceso> accesos,
			List<Incidencia> incidencias, List<Reparacion> reparaciones,
			List<Recaudacion> recaudaciones,
			List<Mantenimiento> mantenimientos, List<Locall> localles,
			List<Realizar> realizaciones, List<Ruta> rutas,
			List<Maquina> maquinas) {
		this.empleados = empleados;
		this.accesos = accesos;
		this.incidencias = incidencias;
		this.reparaciones = reparaciones;
		this.recaudaciones = recaudaciones;
		this.mantenimientos = mantenimientos;
		this.localles = localles;
		this.realizaciones = realizaciones;
		this.rutas = rutas;
		this.maquinas = maquinas;
	}

	public AgenteBD() {
		this.empleados = new LinkedList<Empleado>();
		this.accesos = new LinkedList<Acceso>();
		this.incidencias = new LinkedList<Incidencia>();
		/* this.intervenciones = new LinkedList<Intervencion>(); */
		this.reparaciones = new LinkedList<Reparacion>();
		this.recaudaciones = new LinkedList<Recaudacion>();
		this.mantenimientos = new LinkedList<Mantenimiento>();
		this.localles = new LinkedList<Locall>();
		this.realizaciones = new LinkedList<Realizar>();
		this.rutas = new LinkedList<Ruta>();
		this.maquinas = new LinkedList<Maquina>();
	}

	public List<Empleado> getEmpleados() {
		return empleados;
	}
	
	public Empleado getEmpleadoById(String id){
		Empleado e=null;
		for(int i=0;i<empleados.size();i++)
			if(empleados.get(i).getId().equals(id))
				e=empleados.get(i);
		return e;
	}

	public void setEmpleados(List<Empleado> empleados) {
		this.empleados = empleados;
	}

	public List<Acceso> getAccesos() {
		return accesos;
	}
	
	public Acceso getAccesoById(String id){
		Acceso a=null;
		for(int i=0;i<accesos.size();i++)
			if(accesos.get(i).getId().equals(id))
				a=accesos.get(i);
		return a;
	}

	public void setAccesos(List<Acceso> accesos) {
		this.accesos = accesos;
	}

	public List<Incidencia> getIncidencias() {
		return incidencias;
	}

	public void setIncidencias(List<Incidencia> incidencias) {
		this.incidencias = incidencias;
	}

	/*
	 * public List<Intervencion> getIntervenciones() { return intervenciones; }
	 * 
	 * public void setIntervenciones(List<Intervencion> intervenciones) {
	 * this.intervenciones = intervenciones; }
	 */
	
	public Intervencion getIntervencionById(String id){
		Intervencion i=null;
		for(int rp=0;rp<reparaciones.size();rp++)
			if(reparaciones.get(rp).getId().equals(id))
				i=reparaciones.get(rp);
		if(i==null)
			for(int rc=0;rc<recaudaciones.size();rc++)
				if(recaudaciones.get(rc).getId().equals(id))
					i=recaudaciones.get(rc);
		if(i==null)
			for(int mt=0;mt<mantenimientos.size();mt++)
				if(mantenimientos.get(mt).getId().equals(id))
					i=mantenimientos.get(mt);
		
		return i;
	}
	
	public List<Reparacion> getReparaciones() {
		return reparaciones;
	}

	public void setReparaciones(List<Reparacion> reparaciones) {
		this.reparaciones = reparaciones;
	}

	public List<Recaudacion> getRecaudaciones() {
		return recaudaciones;
	}

	public void setRecaudaciones(List<Recaudacion> recaudaciones) {
		this.recaudaciones = recaudaciones;
	}

	public List<Mantenimiento> getMantenimientos() {
		return mantenimientos;
	}

	public void setMantenimientos(List<Mantenimiento> mantenimientos) {
		this.mantenimientos = mantenimientos;
	}

	public List<Locall> getLocalles() {
		return localles;
	}

	public Locall getLocallById(String id){
		Locall l=null;
		for(int i=0;i<localles.size();i++)
			if(localles.get(i).getId().equals(id))
				l=localles.get(i);
		return l;
	}

	public void setLocalles(List<Locall> localles) {
		this.localles = localles;
	}

	public List<Realizar> getRealizaciones() {
		return realizaciones;
	}

	public void setRealizaciones(List<Realizar> realizaciones) {
		this.realizaciones = realizaciones;
	}

	public List<Ruta> getRutas() {
		return rutas;
	}
	
	public Ruta getRutaById(String id){
		Ruta r=null;
		for(int i=0;i<rutas.size();i++)
			if(rutas.get(i).getId().equals(id))
				r=rutas.get(i);
		return r;
	}

	public void setRutas(List<Ruta> rutas) {
		this.rutas = rutas;
	}

	public List<Maquina> getMaquinas() {
		return maquinas;
	}
	
	public Maquina getMaquinaById(String id){
		Maquina m=null;
		for(int i=0;i<maquinas.size();i++)
			if(maquinas.get(i).getId().equals(id))
				m=maquinas.get(i);
		return m;
	}

	public void setMaquinas(List<Maquina> maquinas) {
		this.maquinas = maquinas;
	}

	public void deleteAll(){
		this.empleados = new LinkedList<Empleado>();
		this.accesos = new LinkedList<Acceso>();
		this.incidencias = new LinkedList<Incidencia>();
		/* this.intervenciones = new LinkedList<Intervencion>(); */
		this.reparaciones = new LinkedList<Reparacion>();
		this.recaudaciones = new LinkedList<Recaudacion>();
		this.mantenimientos = new LinkedList<Mantenimiento>();
		this.localles = new LinkedList<Locall>();
		this.realizaciones = new LinkedList<Realizar>();
		this.rutas = new LinkedList<Ruta>();
		this.maquinas = new LinkedList<Maquina>();
	}
	
	public void loadAll() {
		try {
			Conexion c = new Conexion();
			c.connect();

			loadRutas(c);
			loadLocalles(c);
			loadAccesos(c);
			loadEmpleados(c);
			loadMaquinas(c);
			/*loadIntervenciones(c);*/
			loadRecaudaciones(c);
			loadReparaciones(c);
			loadMantenimientos(c);
			loadIncidencias(c);
			loadRealizaciones(c);

			c.disconnect();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}

	private void loadRutas(Conexion c) {
		try {
			ResultSet sqlRutas = c.execute("SELECT * FROM Ruta");

			while (sqlRutas.next()) {
				rutas.add(new Ruta(sqlRutas.getString("id"), sqlRutas.getString("codigo"), 
						sqlRutas.getDouble("longitud")));
				System.out.println(rutas.get(rutas.size()-1).toString());
			}
			sqlRutas.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}

	private void loadLocalles(Conexion c){
		try{
			ResultSet sqlLocalles=c.execute("SELECT * FROM Locall;");
			String idRuta="";
			while(sqlLocalles.next()){
				localles.add(new Locall(sqlLocalles.getString("id"),
						sqlLocalles.getString("nombre"),sqlLocalles.getString("dueno"),
						sqlLocalles.getString("poblacion"),sqlLocalles.getString("direccion"),
						sqlLocalles.getString("prioridad")));
				idRuta=sqlLocalles.getString("ruta");
				if(idRuta!=null && !idRuta.equals("null") && !idRuta.isEmpty())
					localles.get(localles.size()-1).setRuta(getRutaById(idRuta));
				System.out.println(localles.get(localles.size()-1).toString());
			}
			sqlLocalles.close();
		}catch(SQLException e){
			System.out.println(e.toString());
		}
	}

	private void loadAccesos(Conexion c) {
		try {
			ResultSet sqlAccesos = c.execute("SELECT * FROM Acceso;");

			while (sqlAccesos.next()) {
				accesos.add(new Acceso(sqlAccesos.getString("id"),
						sqlAccesos.getString("tipo")));
				System.out.println(accesos.get(accesos.size()-1).toString());
			}
			sqlAccesos.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}

	private void loadEmpleados(Conexion c) {
		try {
			ResultSet sqlEmpleados = c.execute("SELECT * FROM Empleado;");
			String idRuta="";
			while (sqlEmpleados.next()) {
				empleados.add(new Empleado(sqlEmpleados.getString("id"),
						sqlEmpleados.getString("dni"), sqlEmpleados.getString("nombre"),
						sqlEmpleados.getString("apellido1"), sqlEmpleados.getString("apellido2"),
						sqlEmpleados.getDouble("fondo")));
				idRuta=sqlEmpleados.getString("ruta");
				if(idRuta!=null && !idRuta.equals("null") && !idRuta.isEmpty())
					localles.get(localles.size()-1).setRuta(getRutaById(idRuta));
				System.out.println(empleados.get(empleados.size()-1).toString());
			}
			sqlEmpleados.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}

	private void loadMaquinas(Conexion c) {
		try {
			ResultSet sqlMaquinas = c.execute("SELECT * FROM Maquina;");
			String idLocal="";
			while (sqlMaquinas.next()) {
				maquinas.add(new Maquina(sqlMaquinas.getString("id"),
						sqlMaquinas.getString("nombre"), sqlMaquinas.getString("tipo"),
						sqlMaquinas.getString("modelo"), sqlMaquinas.getString("estado")));
				idLocal=sqlMaquinas.getString("locall");
				if(idLocal!=null && !idLocal.equals("null") && !idLocal.isEmpty()){
					maquinas.get(maquinas.size()-1).setLocal(getLocallById(idLocal));
					maquinas.get(maquinas.size()-1).setPlaza(sqlMaquinas.getInt("plaza"));
				}
				System.out.println(maquinas.get(maquinas.size()-1).toString());
			}
			sqlMaquinas.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}
/*
	private void loadIntervenciones(Conexion c) {
		try {
			ResultSet sqlIntervenciones = c.execute("SELECT * FROM Intervencion;");
			String idMaquina="", idAcceso="";
			while (sqlIntervenciones.next()) {
				idMaquina=sqlIntervenciones.getString("maquina");
				idAcceso=sqlIntervenciones.getString("acceso");
				if(idMaquina!=null && !idMaquina.equals("null") && !idMaquina.isEmpty() && 
						idAcceso!=null && !idAcceso.equals("null") && !idAcceso.isEmpty()){
					intervenciones.add(new Intervencion(sqlIntervenciones.getString("id"),
							sqlIntervenciones.getString("prioridad"), sqlIntervenciones.getString("observaciones"),
							sqlIntervenciones.getString("horain"), sqlIntervenciones.getString("horaout"),
							getMaquinaById(idMaquina), getAccesoById(idAcceso)));
				}
				System.out.println(recaudaciones.get(recaudaciones.size()-1).toString());
			sqlIntervenciones.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}
*/
	private void loadRecaudaciones(Conexion c) {
		try {
			ResultSet sqlRecaudaciones = c.execute("SELECT * FROM Recaudacion r, Intervencion i WHERE r.intervencion=i.id;");
			String idMaquina="", idAcceso="";
			while (sqlRecaudaciones.next()) {
				idMaquina=sqlRecaudaciones.getString("maquina");
				idAcceso=sqlRecaudaciones.getString("acceso");
				if(idMaquina!=null && !idMaquina.equals("null") && !idMaquina.isEmpty() && 
						idAcceso!=null && !idAcceso.equals("null") && !idAcceso.isEmpty()){
					recaudaciones.add(new Recaudacion(sqlRecaudaciones.getString("id"),
							sqlRecaudaciones.getString("prioridad"), sqlRecaudaciones.getString("observaciones"),
							sqlRecaudaciones.getString("horain"), sqlRecaudaciones.getString("horaout"),
							getMaquinaById(idMaquina), getAccesoById(idAcceso), sqlRecaudaciones.getDouble("monto"),
							sqlRecaudaciones.getDouble("deposito"), sqlRecaudaciones.getDouble("contadorin"),
							sqlRecaudaciones.getDouble("contadorout")));
				}
				System.out.println(recaudaciones.get(recaudaciones.size()-1).toString());
			}
			sqlRecaudaciones.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}

	private void loadReparaciones(Conexion c) {
		try {
			ResultSet sqlReparaciones = c.execute("SELECT * FROM Reparacion r, Intervencion i WHERE r.intervencion=i.id;");
			String idMaquina="", idAcceso="";	
			while (sqlReparaciones.next()) {
				idMaquina=sqlReparaciones.getString("maquina");
				idAcceso=sqlReparaciones.getString("acceso");
				if(idMaquina!=null && !idMaquina.equals("null") && !idMaquina.isEmpty() && 
						idAcceso!=null && !idAcceso.equals("null") && !idAcceso.isEmpty()){
					reparaciones.add(new Reparacion(sqlReparaciones.getString("id"),
							sqlReparaciones.getString("prioridad"), sqlReparaciones.getString("observaciones"),
							sqlReparaciones.getString("horain"), sqlReparaciones.getString("horaout"),
							getMaquinaById(idMaquina), getAccesoById(idAcceso), sqlReparaciones.getString("diagnostico"),
							sqlReparaciones.getString("solucion"), sqlReparaciones.getString("material"),
							sqlReparaciones.getString("codigo")));
				}
				System.out.println(reparaciones.get(reparaciones.size()-1).toString());
			}
			sqlReparaciones.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}

	private void loadMantenimientos(Conexion c) {
		try {
			ResultSet sqlMantenimientos = c.execute("SELECT * FROM Mantenimiento m, Intervencion i WHERE m.intervencion=i.id;");
			String idMaquina="", idAcceso="";
			while (sqlMantenimientos.next()) {
				idMaquina=sqlMantenimientos.getString("maquina");
				idAcceso=sqlMantenimientos.getString("acceso");
				if(idMaquina!=null && !idMaquina.equals("null") && !idMaquina.isEmpty() && 
						idAcceso!=null && !idAcceso.equals("null") && !idAcceso.isEmpty()){
					mantenimientos.add(new Mantenimiento(sqlMantenimientos.getString("id"),
							sqlMantenimientos.getString("prioridad"), sqlMantenimientos.getString("observaciones"),
							sqlMantenimientos.getString("horain"), sqlMantenimientos.getString("horaout"),
							getMaquinaById(idMaquina), getAccesoById(idAcceso)));
				}
				System.out.println(mantenimientos.get(mantenimientos.size()-1).toString());
			}
			sqlMantenimientos.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}

	private void loadIncidencias(Conexion c) {
		try {
			ResultSet sqlIncidencias = c.execute("SELECT * FROM Incidencia;");
			String idAcceso="", idMaquina="";
			while (sqlIncidencias.next()) {
				idMaquina=sqlIncidencias.getString("maquina");
				idAcceso=sqlIncidencias.getString("acceso");
				if(idMaquina!=null && !idMaquina.equals("null") && !idMaquina.isEmpty() && 
						idAcceso!=null && !idAcceso.equals("null") && !idAcceso.isEmpty()){
					incidencias.add(new Incidencia(getAccesoById(idAcceso), getMaquinaById(idMaquina),
							sqlIncidencias.getString("horain"), sqlIncidencias.getString("horaout"),
							sqlIncidencias.getString("fecha"), sqlIncidencias.getDouble("contadorin"),
							sqlIncidencias.getDouble("contadorout")));
				}
				System.out.println(incidencias.get(incidencias.size()-1).toString());
			}
			sqlIncidencias.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}

	private void loadRealizaciones(Conexion c) {
		try {
			ResultSet sqlRealizaciones = c.execute("SELECT * FROM Realizar;");
			String idEmpleado="", idIntervencion="";
			while (sqlRealizaciones.next()) {
				idEmpleado=sqlRealizaciones.getString("empleado");
				idIntervencion=sqlRealizaciones.getString("intervencion");
				if(idEmpleado!=null && !idEmpleado.equals("null") && !idEmpleado.isEmpty() && 
						idIntervencion!=null && !idIntervencion.equals("null") && !idIntervencion.isEmpty()){
					realizaciones.add(new Realizar(getEmpleadoById(idEmpleado), getIntervencionById(idIntervencion),
							sqlRealizaciones.getString("fecha")));
				}
				System.out.println(realizaciones.get(realizaciones.size()-1).toString());
			}
			sqlRealizaciones.close();
		} catch (SQLException e) {
			System.out.println(e.toString());
		}
	}
}